<!DOCTYPE html>
<html lang='en'>

<head>
    <meta charset='UTF-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>Document</title>
    <script src='../vue.js'></script>
    <style>
        main {
            padding: 10px;
            border: 1px solid #f66;
            width: 600px;
            border-radius: 10px;
            margin: 50px auto;
        }

        header {
            width: 100%;
            /* background-color: red; */
        }

        header input {
            width: 100%;
            height: 40px;
            font-size: 18px;
            padding-left: 10px;
            box-sizing: border-box;
        }

        .todo-item,
        .todo-footer {
            display: flex;
            justify-content: space-between;
            /* border: 1px solid red; */
            align-items: center;
            border-bottom: 1px solid #ccc;
        }

        .todo-item button {
            height: 30px;
        }

        .todo-item h4,
        .todo-footer p {
            /* background-color: red; */
            flex: 1;
            padding-left: 10px;
            margin: 15px 0;
        }

        .todo-footer {
            border: none;
        }

        input {
            /* 外轮廓 */
            outline: none;
            border-radius: 8px;
            border: 1px solid #ccc;
        }
        /* 获取焦点 */
        input:focus {
            /* 水平 垂直 模糊 颜色 */
            box-shadow: 0 0 5px #f66;

        }
    </style>
</head>

<body>
    <div id='app'>
        <main>
            <!-- 头部提交数据 -->
            <todo-header></todo-header>
            <!-- 中间内容显示 -->
            <!-- 2. 添加自定义事件 -->
             <!-- 父传子 -->
              <!-- 子传父 @del="delTodo" 添加自定义事件从而修改父组件-->
            <todo-item @del="delTodo" v-for="item in todoList" :key="item.id" :todo="item"></todo-item>

            <!-- 页脚记录数量 -->
            <footer class="todo-footer">
                <input v-model="isAll" type="checkbox">
                <p>已完成 {{selectCount}} 件 / 总计：{{todoList.length}} 件</p>
                <button @click="clearClick">清除已完成</button>
            </footer>
        </main>
    </div>
</body>

<template id="header">
    <header>
        <input v-model="title" @keyup.enter="addTodo" placeholder="请输入待办内容" type="text">
    </header>
</template>

<template id="todoitem">
    <!-- 鼠标移入显示删除按钮 -->
     <!-- 计算属性控制 -->
    <div :style="{backgroundColor: bgColor}" class="todo-item" @mouseenter="changeShowDel(true)"
        @mouseleave="changeShowDel(false)">
        <input type="checkbox" v-model="todo.isFlag">
        <h4> {{ todo.title }} </h4>
        <button @click="delClick(todo.id)" v-show="showDel">删除</button>
    </div>
</template>

<script>

    // 定义头部组件
    const todoHeader = {
        template: '#header',
        data() {
            return {
                title: ''
            }
        },
        methods: {
            addTodo() {
                // console.log(this);
                this.$parent.todoList.push({
                    isFlag: false,
                    title: this.title,
                    id: Math.random()
                })
                this.title = ''
            }
        }
    }

    // 定义内容组件
    const todoitem = {
        template: '#todoitem',
        props: ['todo'],
        data() {
            return {
                showDel: false
            }
        },
        methods: {
            changeShowDel(is) {
                this.showDel = is
            },
            delClick(id) {
                // 删除的方法
                // this.$parent.todoList = this.$parent.todoList.filter(todo => todo.id != id)
                // 3. 触发父组件监听的事件，传递参数 id（子传父）
                // $emit 触发自定义事件的方法
                this.$emit('del', id)
            }
        },
        computed: {
        //控制样式变化
            bgColor() {
                return this.showDel ? '#ccc' : '#fff'
            }
        }
    }

    const app = {
        data() {
            return {
                todoList: [
                    { isFlag: true, title: '吃个鸡蛋', id: 'abcdkaj,shdkajshdk' },
                    { isFlag: false, title: '上厕所', id: 'abcdkaasdaskajshdk' },
                    { isFlag: true, title: '喝个奶', id: 'abcdasdasdadhdk' },
                ]
            }
        },
        computed: {
            selectCount() {
                // reduce() 用来计算数量用的，也可以用filter().length
                // 回调，默认值为0
                // count为上一次加起来的总值，todo为遍历出的单项
                return this.todoList.reduce((count, todo) => {

                    return count + (todo.isFlag ? 1 : 0)
                }, 0)
            },
            isAll: {
                get() {
                    return this.selectCount == this.todoList.length
                },
                set(val) {
                    this.todoList.forEach(todo => {
                        todo.isFlag = val
                    });
                }
            }
        },
        methods: {
            // 1. 定义接收方法
            delTodo(id) {
                this.todoList = this.todoList.filter(todo => todo.id != id)
            },
            // 清除已完成的项目
            clearClick() {
                this.todoList = this.todoList.filter(todo => todo.isFlag != true)
            }
        },
        components: {
            TodoHeader: todoHeader,
            TodoItem: todoitem
        }
    }
    const vm = Vue.createApp(app).mount('#app')
</script>

</html>